package pool;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
/*
自定义线程池对象
1.ThreadPoolExecutor(参数如下)
    参数1 核心线程数量（正是员工）
    参数2 最大线程数量（正式员工＋临时工）
    参数3 空闲时间（正式员工数量不够时，需等待多长时间才启动临时线程）
    参数4 时间单位
    参数5 任务队列（指定排队人数）
        有界队列 ArrayBlockingQueue<>(n)
        无界队列 LinkedBlockingQueue<>()
    参数6 线程对象任务工厂（使用默认的即可）
    参数7 拒绝策略
        AbortPolicy:丢弃任伍抛出异常，推荐
        DiscardPolicy:丢弃任务，不抛异常，不推荐
        DiscardOldestPolicy:抛弃队列中等待最久的任务，并把当前任务加入新队列
        CallerRunPolicy:调用任务的run方法，绕过线程池直接进行

2.提交的线程任务数>任务队列数+核心线程数时，招聘临时工
  提交的线程任务数>任务队列数+最大线程数时，启动拒绝策略
 */

public class Demo2 {
    public static void main(String[] args) {
        ThreadPoolExecutor pool = new ThreadPoolExecutor(
                2,
                5,
                60,
                TimeUnit.SECONDS,
                new ArrayBlockingQueue<>(10),
                Executors.defaultThreadFactory(),
                new ThreadPoolExecutor.AbortPolicy()
        );
        for (int i = 0; i < 16; i++) {
            pool.submit(new Runnable() {
                @Override
                public void run() {
                    System.out.println(Thread.currentThread().getName()+"提交了任务");
                }
            });
        }
        pool.shutdown();

    }
}
